package main;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.file.FileWriter;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import java.util.ArrayList;
import java.util.Date;

/**
 * 工具类
 *
 * @author hanj.cn @outlook.com
 */
public class MyUtils {

    /**
     * 获取设备信息
     *
     * @return 设备信息 devices
     */
    public static ArrayList<JSONObject> getDevices() {

        // url
        String url = "http://melogin.cn/stok=" + Initialize.getStok(false) + "/ds";

        // 构造body
        String bodyStr = "{\"hosts_info\":{" + "\"table\":\"host_info\"" + "}," + "\"method\":\"get\"" + "}";

        // 发送获取设备信息的get请求
        JSONObject respJson = JSONUtil.parseObj(HttpUtil.post(url, bodyStr));

        String key = "error_code";

        String errorCode = "-40401";

        // 判断stok是否还有效
        if (errorCode.equals(respJson.get(key, String.class))) {

            // 没有获取到,需要重新通过登录获取stok
            Initialize.getStok(true);

            return null;
        }

        // 从响应中读取并保存设备列表
        JSONArray respJsonArray = respJson.get("hosts_info", JSONObject.class).get("host_info", JSONArray.class);

        ArrayList<JSONObject> deviceList = new ArrayList<>();

        // 解析json
        for (int i = 0; i < respJsonArray.size(); i++) {

            deviceList.add(respJsonArray.get(i, JSONObject.class).get("host_info_" + i, JSONObject.class));

        }

        return deviceList;
    }

    /**
     * 获取格式化的时间
     *
     * @return 时间 time
     */
    public static Date getTime() {

        // 获取格式化后的时间
        return DateUtil.date(System.currentTimeMillis());
    }

    /**
     * 获取token
     *
     * @return token stok
     */
    public static String getStok() {

        JSONObject response = JSONUtil.parseObj(HttpRequest.post("http://melogin.cn/").header("Content-Type", "text/plain").body("{\r\n  \"method\": \"do\",\r\n  \"login\": {\r\n    \"password\": \"" + getEncodedPwd(Initialize.getPassword()) + "\"\r\n  }\r\n}").timeout(20000).execute().body());
        return response.get("stok", String.class);
    }

    /**
     * 加密密码
     *
     * @param rawPwd 未加密的密码
     * @return 已加密的密码 encoded pwd
     */
    public static String getEncodedPwd(String rawPwd) {

        ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");

        try {
            String script = "function securityEncode(a,b,d){var c='',e,g,h,m,p=187,r=187;g=a.length;h=b.length;m=d.length;e=g>h?g:h;for(var k=0;k<e;k++)r=p=187,k>=g?r= b.charCodeAt(k):k>=h?p=a.charCodeAt(k):(p=a.charCodeAt(k),r=b.charCodeAt(k)),c+=d.charAt((p^r)%m);return c}";
            engine.eval(script);
            Invocable invocable = (Invocable) engine;
            return (String) invocable.invokeFunction("securityEncode", "RDpbLfCPsJZ7fiv", rawPwd, "yLwVl0zKqws7LgKPRQ84Mdt708T1qQ3Ha7xv3H7NyU84p21BriUWBU43odz3iP4rBL3cD02KZciXTysVXiV8ngg6vL48rPJyAUw0HurW20xqxv9aYb4M9wK1Ae0wlro510qXeU07kV57fQMc8L6aLgMLwygtc0F10a0Dg70TOoouyFhdysuRMO51yY5ZlOZZLEal1h0t9YQW0Ko7oBwmCAHoic4HYbUyVeU3sfQ1xtXcPcf1aT303wAQhv66qzW");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;

    }

    /**
     * 写内容到文件
     *
     * @param filePath     文件地址
     * @param content      要写入的内容
     * @param isNeedAppend 是否需要拼接
     */
    public static void writeToFile(String filePath, String content, Boolean isNeedAppend) {

        // 判断文件是否存在
        if (!FileUtil.exist(filePath)) {

            // 不存在则创建文件
            FileUtil.touch(filePath);
        }

        // 获取文件对象
        FileWriter writer = new FileWriter(filePath);

        // 写入
        if (isNeedAppend) {
            writer.append(content);
        } else {
            writer.write(content);
        }

    }

}





